// 解构赋值

{
    // 传统的变量赋值方式
    let arr = [1, 2, 3];
    let a = arr[0];
    let b = arr[1];
    let c = arr[2];
    console.log(a, b, c);
}

{
    // 解构赋值的方式
    let arr = [1, 2, 3];
    let [a, b, c] = arr;
    console.log(a, b, c);
}

// 1. 数组的解构赋值
{
    // 解构赋值支持嵌套
    let arr = [1, 2, [3, 4]];
    let [a, b, [c, d]] = arr;
    console.log(a, b, c, d); // 1 2 3 4
}

{
    // 数组解构赋值受排列次序的影响
    let arr = [2, 1, [4, 3]];
    let [a, b, [c, d]] = arr; // 2 1 4 3
    console.log(a, b, c, d);
}

{
    let arr = [2, 1, [4, 3]];
    let [b, a, [d, c]] = arr;
    console.log(a, b, c, d); // 1 2 3 4
}

{
    // 不完全解构，如果赋值不成功，变量值为 undefined
    let arr = [1, 2];
    let [a, b, c] = arr;
    console.log(a, b, c); // 1 2 undefined
}

{
    // 允许设置默认值，如果赋值不成功（不完全解构），则使用默认值
    let arr = [1, 2];
    let [a, b, c = 3] = arr;
    console.log(a, b, c); // 1 2 3
}

{
    // 允许设置默认值，如果赋值不成功（完全解构），则使用默认值
    let arr = [1, 2, undefined];
    let [a, b, c = 3] = arr;
    console.log(a, b, c); // 1 2 3
}

{
    // 允许设置默认值，如果赋值成功，则不使用默认值
    let arr = [1, 2, 4];
    let [a, b, c = 3] = arr;
    console.log(a, b, c); // 1 2 4
}

function foo1(a, b, c) {
    console.log(a, b, c);
}

let a = 1, b = 2, c = 3;

foo1(a, b, c);

function foo2([a, b, c]) {
    console.log(a, b, c);
}

let arr2 = [1, 2, 3];

foo2(arr2);

// 2. 对象的解构赋值

// 对象的解构赋值和数组的解构赋值基本一致，但是对象不会受属性的排列次序的影响。

{
    let { a, b, c } = { a: 1, b: 2, c: 3 };
    console.log(a, b, c); // 1 2 3
}

{
    let { b, a, c } = { a: 1, b: 2, c: 3 };
    console.log(a, b, c); // 1 2 3
}

{
    let { b, a, c } = { c: 3, b: 2, a: 1 };
    console.log(a, b, c); // 1 2 3
}

// 对象的解构赋值是跟属性名关联起来的，变量名和属性名一致，才能成功赋值。

{
    // 不完全解构
    let { a, b, c } = { a: 1, b: 2, d: 3 };
    console.log(a, b, c); // 1 2 undefined
}

{
    // 允许设置默认值
    let { a, b, c = 4 } = { a: 1, b: 2, d: 3 };
    console.log(a, b, c); // 1 2 4
}

{
    // 允许设置默认值
    let { a, b, c = 4 } = { a: 1, b: 2, c: 3 };
    console.log(a, b, c); // 1 2 3
}

{
    // 支持嵌套
    let {a, a: {b}} = {a: {b: 1}};
    console.log(a, b); // {b: 1} 1
}

let {name, age} = {
    name: "jayjun",
    age: 18
};

console.log(name, age);

function foo3({a, b, c}) {
    console.log(a, b, c);
}

foo3({a: 1, b: 2});

// 3. 字符串的解构赋值

{
    let word = "我是一只小小小鸟";
    let [a, b, c, d, e, f, g, h] = word;
    console.log(a, b, c, d, e, f, g, h);
}
